package org.yelongframework.json.text;

import org.yelongframework.core.text.AbstractTextCompressFormat;

/**
 * 默认实现
 * 
 * @since 1.0.0
 */
public class DefaultJsonCompressFormat extends AbstractTextCompressFormat implements JsonCompressFormat {

	// ==================================================格式化==================================================

	@Override
	public String format(String json) {
		int level = 0;
		StringBuffer jsonForMatStr = new StringBuffer();
		for (int i = 0; i < json.length(); i++) {
			char c = json.charAt(i);
			if (level > 0 && '\n' == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {
				jsonForMatStr.append(getLevelStr(level));
			}
			switch (c) {
			case '{':
			case '[':
				jsonForMatStr.append(c + "\n");
				level++;
				break;
			case ',':
				char d = json.charAt(i - 1);
				if (d == '"' || d == ']') {
					jsonForMatStr.append(c + "\n");
				} else {
					jsonForMatStr.append(c);
				}
				break;
			case '}':
			case ']':
				jsonForMatStr.append("\n");
				level--;
				jsonForMatStr.append(getLevelStr(level));
				jsonForMatStr.append(c);
				break;
			default:
				jsonForMatStr.append(c);
				break;
			}
		}
		return jsonForMatStr.toString();
	}

	private String getLevelStr(int level) {
		StringBuffer levelStr = new StringBuffer();
		for (int levelI = 0; levelI < level; levelI++) {
			levelStr.append("\t");
		}
		return levelStr.toString();
	}

}
